package TP2.controlador;

import TP2.modelo.Escenario;
import TP2.modelo.*;
import TP2.modelo.Algo42;

import java.util.*;
import java.awt.Point;
import TP2.vista.*;

import TP2.controlador.ObservadorDePuntos;

import ar.uba.fi.algo3.titiritero.ControladorJuego;
import ar.uba.fi.algo3.titiritero.ObjetoVivo;
import ar.uba.fi.algo3.titiritero.SuperficieDeDibujo;
//import ar.uba.fi.algo3.titiritero.audio.Elemento;

public class Juego implements ObjetoVivo {

	Escenario escenario;
	ControladorJuego controlador;
	
	public Juego(SuperficieDeDibujo superficieDeDibujo){
		
		escenario = Escenario.getInstancia();
		Algo42 avionDelJugador = new Algo42(new Point(40,40));
		escenario.agregarAvionDelJugador(avionDelJugador);
		
		Avioneta avionBombardero = new Avioneta(new Point(40,40));
		escenario.agregarAvionAlJuego(avionBombardero);
		
		/*
		 * Luego instancio los objetos del framework: una ventana y el controlador
		 */		
		
		controlador = new ControladorJuego(true);
		controlador.setSuperficieDeDibujo(superficieDeDibujo);
		
		/*
		 * Instancio un cuadrado para que actue como vista del mapa
		 */
		VistaMapa vistaMapa = new VistaMapa();
		vistaMapa.setPosicionable(escenario);
		
		/*
		 * Instancio una imagen para que actue como vista de las naves
		 */
		VistaAlgo42 vistaAlgo42 = new VistaAlgo42();
		vistaAlgo42.setPosicionable(avionDelJugador);
		
		VistaBombardero vistaBombardero = new VistaBombardero();
		vistaBombardero.setPosicionable(avionBombardero);
		
		/*
		 * agrego las naves a la lista de objetos vivios del controlador
		 * para que este le de vida dentro del gameloop
		 */
		controlador.agregarObjetoVivo(avionBombardero);
		controlador.agregarObjetoVivo(avionDelJugador);
		controlador.agregarObjetoVivo(this);
	
		/*
		 * Agrego los objetos que actuan como vista a la lista de dibujables del controlador
		 * para que sean repintados al final de cada gameloop
		 */
		controlador.agregarDibujable(vistaMapa);
		controlador.agregarDibujable(vistaBombardero);
		controlador.agregarDibujable(vistaAlgo42);		
		
		controlador.agregarMouseClickObservador(vistaMapa);
		controlador.setIntervaloSimulacion(20);
	}
	
	public void comenzar(){
		controlador.comenzarJuegoAsyn();	
	}
	
	public void detener() {
		controlador.detenerJuego();
	}
	
	public void agregarObservadorDePuntos(ObservadorDePuntos observador) {
		this.observadores.add(observador);
	}
	
	private ArrayList<ObservadorDePuntos> observadores = new ArrayList<ObservadorDePuntos>();

	private int cantidadPuntos;
	
	@Override
	public void vivir() {
		int a = escenario.vivir();
		if(a == -1) {
			//JUEGO TERMINADO
			//escenario.terminarJuego();
		} else if(a == 1){
			//PASA DE NIVEL
		}
		int nuevaCantidadPuntos = escenario.getPuntos();
		if(nuevaCantidadPuntos != this.cantidadPuntos){
			this.cantidadPuntos = nuevaCantidadPuntos;

			/*for(int i=cantidadChoques; i <= nuevaCantidadChoques; i++)
				this.controlador.getReproductorDeAudio().reproducir(new Elemento(60, 20)); */

			for (ObservadorDePuntos observador : this.observadores) {
				observador.seActualizaronLosPuntos(cantidadPuntos);
			}
		}
	}
}
